package com.ruoyi.web.controller.common;

import lombok.NonNull;
import org.fusesource.jansi.Ansi;
import org.fusesource.jansi.AnsiConsole;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.time.Instant;

@Component
public class StartupSuccessListener implements ApplicationListener<ApplicationReadyEvent> {

    // 记录应用启动开始时间（在构造方法中初始化）
    private final Instant startupStartTime = Instant.now();

    @Override
    public void onApplicationEvent(@NonNull ApplicationReadyEvent event) {
        // 初始化 Jansi 控制台（支持彩色输出）
        AnsiConsole.systemInstall();

        // 1. 定义彩色 ASCII 艺术字（使用 Ansi 颜色码）
        String colorfulArt = Ansi.ansi()
                .fg(Ansi.Color.GREEN) // 绿色文字
                .a("""
                                  _____                    _____                    _____                    _____                _____         \s
                                 /\\    \\                  /\\    \\                  /\\    \\                  /\\    \\              |\\    \\        \s
                                /::\\    \\                /::\\    \\                /::\\    \\                /::\\    \\             |:\\____\\       \s
                               /::::\\    \\              /::::\\    \\              /::::\\    \\              /::::\\    \\            |::|   |       \s
                              /::::::\\    \\            /::::::\\    \\            /::::::\\    \\            /::::::\\    \\           |::|   |       \s
                             /:::/\\:::\\    \\          /:::/\\:::\\    \\          /:::/\\:::\\    \\          /:::/\\:::\\    \\          |::|   |       \s
                            /:::/__\\:::\\    \\        /:::/__\\:::\\    \\        /:::/__\\:::\\    \\        /:::/  \\:::\\    \\         |::|   |       \s
                           /::::\\   \\:::\\    \\      /::::\\   \\:::\\    \\      /::::\\   \\:::\\    \\      /:::/    \\:::\\    \\        |::|   |       \s
                          /::::::\\   \\:::\\    \\    /::::::\\   \\:::\\    \\    /::::::\\   \\:::\\    \\    /:::/    / \\:::\\    \\       |::|___|______ \s
                         /:::/\\:::\\   \\:::\\____\\  /:::/\\:::\\   \\:::\\    \\  /:::/\\:::\\   \\:::\\    \\  /:::/    /   \\:::\\ ___\\      /::::::::\\    \\\s
                        /:::/  \\:::\\   \\:::|    |/:::/__\\:::\\   \\:::\\____\\/:::/  \\:::\\   \\:::\\____\\/:::/____/     \\:::|    |    /::::::::::\\____\\
                        \\::/   |::::\\  /:::|____|\\:::\\   \\:::\\   \\::/    /\\::/    \\:::\\  /:::/    /\\:::\\    \\     /:::|____|   /:::/~~~~/~~     \s
                         \\/____|:::::\\/:::/    /  \\:::\\   \\:::\\   \\/____/  \\/____/ \\:::\\/:::/    /  \\:::\\    \\   /:::/    /   /:::/    /        \s
                               |:::::::::/    /    \\:::\\   \\:::\\    \\               \\::::::/    /    \\:::\\    \\ /:::/    /   /:::/    /         \s
                               |::|\\::::/    /      \\:::\\   \\:::\\____\\               \\::::/    /      \\:::\\    /:::/    /   /:::/    /          \s
                               |::| \\::/____/        \\:::\\   \\::/    /               /:::/    /        \\:::\\  /:::/    /    \\::/    /           \s
                               |::|  ~|               \\:::\\   \\/____/               /:::/    /          \\:::\\/:::/    /      \\/____/            \s
                               |::|   |                \\:::\\    \\                  /:::/    /            \\::::::/    /                          \s
                               \\::|   |                 \\:::\\____\\                /:::/    /              \\::::/    /                           \s
                                \\:|   |                  \\::/    /                \\::/    /                \\::/____/                            \s
                                 \\|___|                   \\/____/                  \\/____/                  ~~                                  \s
                                                                                                                                                \s
                        """)
                .toString();

        // 2. 输出彩色造型
        System.out.println("\n" + colorfulArt + "\n");

        // 关闭 Jansi 控制台（可选）
        AnsiConsole.systemUninstall();

        getEnvironmentData(event);
    }

    private void getEnvironmentData( ApplicationReadyEvent event) {
        // 1. 获取应用环境信息
        Environment env = event.getApplicationContext().getEnvironment();
        String appName = env.getProperty("spring.application.name", "Spring Boot App");
        String profile = String.join(",", env.getActiveProfiles());
        String port = env.getProperty("server.port", "8080");
        String contextPath = env.getProperty("server.servlet.context-path", "/");

        // 2. 计算启动耗时
        long startupDuration = Duration.between(startupStartTime, Instant.now()).toMillis();

        // 获取当前工作目录
        String currentDir = System.getProperty("user.dir");

        // 3. 定义启动成功的 ASCII 造型（可自定义）
        String startupBanner = """
                App Name: %-5s │ Profiles: %-5s │ Port: %-5s │ Context Path: %-5s │ Startup Time: %-5d ms | 当前目录: %-5s
                """.formatted(appName, profile, port, contextPath, startupDuration,currentDir);

        // 4. 输出造型（使用 System.out 或日志框架）
        System.out.println("\n" + startupBanner + "\n");
    }
}
